#include"BlockQueue.hpp"
#include"Task.hpp"
#include<ctime>
#include<unistd.h>
#include<pthread.h>
#include<iostream>

using namespace std;

int Add(int x,int y)
{
    return x+y;
}
void* productor(void* args)
{
    BlockQueue<Task>* bq=new BlockQueue<Task>;
    while(true)
    {
        int x=rand()%10+1;
        int y=rand()%5+1;
        Task t(x,y,Add);
        bq->push(t);
        cout<<pthread_self()<<"生产者:"<<t._x<<" + "<<t._y<<" = "<<endl;
        sleep(1);
    }
}
void* consumer(void* args)
{
    BlockQueue<Task>* bq=new BlockQueue<Task>;
    while(true)
    {
        Task t;
        bq->pop(&t);
        cout<<pthread_self()<<"消费者："<<t._x<<" + "<<t._y<<" = "<<endl;
        sleep(1);
    }
}

int main()
{
    srand((uint64_t)time(nullptr)^getpid()^0XFF546);
    BlockQueue<Task>* bq=new BlockQueue<Task>();
    
    pthread_t c[2],p[2];
    pthread_create(c,nullptr,consumer,(void*)bq);
    pthread_create(c+1,nullptr,consumer,(void*)bq);
    pthread_create(p,nullptr,productor,(void*)bq);
    pthread_create(p+1,nullptr,productor,(void*)bq);

    for(int i=0;i<2;i++)
    {
        pthread_join(c[i],nullptr);
    }
    for(int i=0;i<2;i++)
    {
        pthread_join(p[i],nullptr);
    }
    
    delete bq;
    return 0;
}



// #include"BlockQueue.hpp"
// #include"Task.hpp"
// #include<ctime>
// #include<unistd.h>
// #include<pthread.h>

// using namespace std;

// int Add(int x,int y)
// {
//     return x+y;
// }

// void* productor(void* args)
// {
//     BlockQueue<int>* bq=(BlockQueue<int>*)args;
//     int x=rand()%10+1;
//     int y=rand()%5+1;
//     Task task(x,y,Add);
//     bq->push(task);
//     cout<<"生产者:"<<"produce "<<task._x<<" + "<<task._y<<"endl;"
// }
// void* consumer(void* args)
// {
//     BlockQueue<Task>* bq=new BlockQueue<Task>();
//     Task task;
//     bq->pop(&task);
//     cout<<pthread_self()<<"消费者: 消费"<<task._x<<" + "<<task._y<<"="<<task()<<endl;
// }

// int main()
// {
//     srand((uint64_t)time(nullptr)^getpid()^0XFF45);
//     BlockQueue<Task>* bq=new BlockQueue<Task>();

//     pthread_t c[3],p[3];
//     for(int i=0;i<3;i++)
//     {
//         pthread_create(c+i,nullptr,consumer,(void*)bq);
//         pthread_create(p+i,nullptr,productor,(void*)bq);
//     }

//     for(int i=0;i<3;i++)
//     {
//         pthread_join(c[i],nullptr);
//         pthread_join(p[i],nullptr);
//     }

//     delete bq;
//     return 0;
// }